注意:所有文章除特别说明外,转载请注明出处.
[TOC]
序列化/反序列化
所有要实现序列化的类都必须要实现Serializable接口(位于java.lang包中)。如果一个类能够被序列化,那么它的子类也能够被序列化。由于static代表类的成员,transient(Java语言关键字 当其声明一个实例变量时,当对象存储时,它的值不需要维持)代表对象的临时数据。
1.使用序列化的场合
1.需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。
2.序列化能实现深复制,即可以复制引用对象。
2.反序列化
将流转换为对象,在序列化与反序列化的过程中,serialVersionID起着非常重要的作用,所以在编程的时候最好显示的声明 static final serialVersionID 。
自定义serialVersionID优点:
1.提高程序的运行效率
2.提高程序不同平台上的兼容性
3.增强程序各个版本之间的可兼容性
3.对象序列化(存储)的方法步骤
1.创建FileOutputStream,如果文件不存在会自动被创建
FileOutputStream fileStream = new FileOutputStream("file.ser");//创建存储文件的对象
2.创建ObjectOutputStream
ObjectOutputStream os = new ObjectOutputStream(fileStream);
3.写入对象
os.writeObject(characterOne);
4.关闭ObjectOutputStream
os.close();//关闭所关联的输出串流
提示:如果需要类被序列化,就实现Serializable接口,此接口没有任何方法需要实现。其唯一的目的就是声明有实现它的类是可以被序列化的。即此类型对象可以通过序列化机制来进行存储。
4.对象反序列化的步骤
1.创建FileInputStream类
FileInputStream fileStream = new FileInputStream("myfile.ser");
2.创建ObjectInputStream
ObjectInputStream os = new ObjectInputStream(fileStream);
3.读取文件
Object one = os.readObject();//每次调用readObject()都会从stream中读取下一个对象
4.转换对象类型
类型 name = (类型) one;//返回值是Object类型,因此需要转换类型
5.关闭ObjectInputStream
os.close();//FileInputStream会自动跟着关掉
反序列化是,Java虚拟机会通过尝试在堆上创建一个新的对象,让它维持与被序列化时有相同状态来恢复对象的原状。
package cn.edu.xidian.B.redis;
import java.io.*;
public class SerializeUtil {
/**
* 序列化
* @param object
* @return
*/
public static byte[] serialize(Object object){
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 反序列化
* @param bytes
* @return
*/
public static Object unSerialize(byte[] bytes){
ByteArrayInputStream bais = null;
try {
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}